From 556703ea3482cb8135d411ea4bf4519267fc8131 Mon Sep 17 00:00:00 2001 From: "mjw@wray-m-3.hpl.hp.com" Date: Thu, 12 Aug 2004 14:43:17 +0000 Subject: [PATCH] bitkeeper revision 1.1159.1.42 (411b8205n-7QEGvjIUl4GfoBiiNpcw) Destroy domain earlier in migration to allow migration to localhost. --- tools/python/xen/xend/XendMigrate.py | 21 ++++++++++++++--- tools/python/xen/xend/server/messages.py | 30 ++++++++++++++---------- tools/xfrd/xfrd.c | 28 ++++++++++++++++++++++ tools/xfrd/xfrd.h | 1 + 4 files changed, 64 insertions(+), 16 deletions(-) diff --git a/tools/python/xen/xend/XendMigrate.py b/tools/python/xen/xend/XendMigrate.py index cc248d427b..b98e5d87fc 100644 --- a/tools/python/xen/xend/XendMigrate.py +++ b/tools/python/xen/xend/XendMigrate.py @@ -1,5 +1,7 @@ # Copyright (C) 2004 Mike Wray +import traceback + import errno import sys import socket @@ -156,6 +158,19 @@ class XfrdInfo: print 'xfr_progress>', val return None + def xfr_vm_destroy(self, xfrd, val): + print 'xfr_vm_destroy>', val + try: + vmid = sxp.child0(val) + val = self.xd.domain_destroy(vmid) + if vmid in self.paused: + del self.paused[vmid] + if vmid in self.suspended: + del self.suspended[vmid] + except: + val = errno.EINVAL + return ['xfr.err', val] + def xfr_vm_pause(self, xfrd, val): print 'xfr_vm_pause>', val try: @@ -221,7 +236,9 @@ class XfrdInfo: d.addErrback(cberr) d.setTimeout(self.timeout) return d - except: + except Exception, err: + print 'xfr_vm_suspend> Exception', err + traceback.print_exc() val = errno.EINVAL return ['xfr.err', val] @@ -401,8 +418,6 @@ class XendMigrate: @param port: destination port @return: deferred """ - if host in ['localhost', '127.0.0.1']: - raise XendError('cannot migrate to localhost') # Check dom for existence, not migrating already. # Subscribe to migrate notifications (for updating). xid = self.nextid() diff --git a/tools/python/xen/xend/server/messages.py b/tools/python/xen/xend/server/messages.py index c61d3598ae..e966ec9003 100644 --- a/tools/python/xen/xend/server/messages.py +++ b/tools/python/xen/xend/server/messages.py @@ -1,5 +1,6 @@ import sys import struct +import types from xen.lowlevel import xu @@ -230,19 +231,22 @@ def unpackMsg(ty, msg): @rtype: dict """ args = msg.get_payload() - mac = [0, 0, 0, 0, 0, 0] - macs = [] - for (k, v) in args.items(): - if k.startswith('mac['): - macs += k - i = int(k[4:5]) - mac[i] = v - else: - pass - if macs: - args['mac'] = mac - for k in macs: - del args[k] + if isinstance(args, types.StringType): + args = { 'value': args } + else: + mac = [0, 0, 0, 0, 0, 0] + macs = [] + for (k, v) in args.items(): + if k.startswith('mac['): + macs += k + i = int(k[4:5]) + mac[i] = v + else: + pass + if macs: + args['mac'] = mac + for k in macs: + del args[k] if DEBUG: msgid = msg.get_header()['id'] print ') Sxpr oxfr_progress; // (xfr.progress ) Sxpr oxfr_save; // (xfr.save ) Sxpr oxfr_save_ok; // (xfr.save.ok) +Sxpr oxfr_vm_destroy;// (xfr.vm.destroy ) Sxpr oxfr_vm_suspend;// (xfr.vm.suspend ) Sxpr oxfr_xfr; // (xfr.xfr ) Sxpr oxfr_xfr_ok; // (xfr.xfr.ok ) @@ -113,6 +114,7 @@ void xfr_init(void){ oxfr_progress = intern("xfr.progress"); oxfr_save = intern("xfr.save"); oxfr_save_ok = intern("xfr.save.ok"); + oxfr_vm_destroy = intern("xfr.vm.destroy"); oxfr_vm_suspend = intern("xfr.vm.suspend"); oxfr_xfr = intern("xfr.xfr"); oxfr_xfr_ok = intern("xfr.xfr.ok"); @@ -566,6 +568,28 @@ int xfr_vm_suspend(Conn *xend, uint32_t vmid){ return err; } +int xfr_send_destroy(Conn *conn, uint32_t vmid){ + int err = 0; + + err = IOStream_print(conn->out, "(%s %d)", + atom_name(oxfr_vm_destroy), vmid); + return (err < 0 ? err : 0); +} + +/** Destroy a vm on behalf of save/migrate. + */ +int xfr_vm_destroy(Conn *xend, uint32_t vmid){ + int err = 0; + dprintf("> vmid=%u\n", vmid); + err = xfr_send_destroy(xend, vmid); + if(err) goto exit; + IOStream_flush(xend->out); + err = xfr_response(xend); + exit: + dprintf("< err=%d\n", err); + return err; +} + /** Get vm state. Send transfer message. * * @param peer connection @@ -584,6 +608,10 @@ int xfr_send_state(XfrState *state, Conn *xend, Conn *peer){ err = xen_domain_snd(xend, peer->out, state->vmid, state->vmconfig, state->vmconfig_n); if(err) goto exit; + // Sending the domain suspends it, and there's no way back. + // So destroy it now. If anything goes wrong now it's too late. + err = xfr_vm_destroy(xend, state->vmid); + if(err) goto exit; IOStream_flush(peer->out); // Read the response from the peer. err = Conn_sxpr(peer, &sxpr); diff --git a/tools/xfrd/xfrd.h b/tools/xfrd/xfrd.h index 9de464549b..0671b383eb 100644 --- a/tools/xfrd/xfrd.h +++ b/tools/xfrd/xfrd.h @@ -13,4 +13,5 @@ struct Conn; extern int xfr_vm_suspend(struct Conn *xend, uint32_t vmid); +extern int xfr_vm_destroy(struct Conn *xend, uint32_t vmid); #endif -- 2.30.2